package com.dk.config;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import java.util.Map;

/**
 * 动态数据源配置
 * @author: Eayon
 * @time: 2020/6/3 14:35
 * @version: 1.0.0
 * @description:
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    /**
     * 线程局部变量 用来保存数据源名称
     */
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    /**
     * 将接收到的主库从库数据源 和 默认数据源（主库）配置写入AbstractRoutingDataSource类的targetDataSources这个Map
     * @param targetDataSources
     * @param defaultTargetDataSource
     */
    public DynamicDataSource(Map<Object, Object> targetDataSources, Object defaultTargetDataSource) {
        super.setTargetDataSources(targetDataSources);
        super.setDefaultTargetDataSource(defaultTargetDataSource);
    }


    /**
     * 动态的通过数据源名称去线程局部变量中获取数据源
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        //根据程局部变量中保存的数据源名称到AbstractRoutingDataSource类的targetDataSources这个Map中获取数据源
        //那么获取到的数据源就是最终使用的数据源
        return getDataSource();
    }

    /**
     * 将数据源名称保存在线程局部变量
     * @param dataSource
     */
    public static void setDataSource(String dataSource) {
        contextHolder.set(dataSource);
    }

    /**
     * 从程局部变量中获取数据源名称
     * @return
     */
    public static String getDataSource() {
        return contextHolder.get();
    }

    /**
     * 请看程局部变量中的数据源名称
     */
    public static void clearDataSource() {
        contextHolder.remove();
    }


}
